home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / filesyst / dosfs / dmsdosfs.000 / dmsdosfs / dmsdosfs-0.6.9b / dpatch.c < prev    next >
C/C++ Source or Header  |  1996-06-17  |  3KB  |  146 lines

  1. /* dpatch.c
  2.  
  3.    A trial to develop an intelligent patch program
  4.    (failed- but it's enough for dmsdos installation)
  5.    (Using diffs, I didn't manage to maintain 1.2 *and* 1.3 kernel support 
  6.     without having to write two completely different packages :-( )
  7.    
  8. */
  9.  
  10. #include<stdio.h>
  11. #include<string.h>
  12.  
  13. #define MAXLEN 500
  14.  
  15. int readline(FILE*f,char*text,int max)
  16. { int i;
  17.   int c;
  18.  
  19.   i=0;
  20.   while((c=fgetc(f))!=EOF&&c!='\n'&&i<max)
  21.   { text[i]=c;
  22.     ++i;
  23.   }
  24.   text[i]='\0';
  25.   
  26.   if(c==EOF&&text[0]=='\0')return EOF;
  27.   return i;
  28. }
  29.  
  30. void writeline(FILE*f,char*text)
  31. {
  32.   fprintf(f,"%s\n",text);
  33. }
  34.  
  35. int xcmp(char*xa,char*xb)
  36. { int i;
  37.   char sa[MAXLEN];
  38.   char sb[MAXLEN];
  39.   char * a;
  40.   char * b;
  41.   
  42.   strcpy(sa,xa);
  43.   strcpy(sb,xb);
  44.   a=sa;
  45.   b=sb;
  46.  
  47.   while(*a==' '||*a=='\t')++a;
  48.   while(*b==' '||*b=='\t')++b;
  49.   i=strlen(a)-1;
  50.   while(i>=0&&(a[i]==' '||a[i]=='\t')){a[i]='\0';--i;}
  51.   i=strlen(b)-1;
  52.   while(i>=0&&(b[i]==' '||b[i]=='\t')){b[i]='\0';--i;}
  53.   
  54.   return strcmp(a,b);
  55. }
  56.  
  57. int main(int argc,char*argv[])
  58. { FILE*in;
  59.   FILE*out;
  60.   FILE*pat;
  61.   int a;
  62.   int i;
  63.   char patchstring[MAXLEN];
  64.   char actual[MAXLEN];
  65.   
  66.   if(argc!=4)
  67.   { printf("DPATCH 0.1.1 (C) 1995 Frank Gockel\n\n");
  68.     printf("Usage: dpatch infile outfile patchfile\n");
  69.     return 1;
  70.   }
  71.   
  72.   in=fopen(argv[1],"r");
  73.   if(in==NULL)
  74.   { printf("Error: File %s not found.\n",argv[1]);
  75.     return 2;
  76.   }
  77.   pat=fopen(argv[3],"r");
  78.   if(pat==NULL)
  79.   { printf("Error: File %s not found.\n",argv[3]);
  80.     fclose(in);
  81.     return 2;
  82.   }
  83.   out=fopen(argv[2],"w");
  84.   if(out==NULL)
  85.   { printf("Error: Could not write file %s.\n",argv[2]);
  86.     fclose(in);
  87.     fclose(pat);
  88.     return 3;
  89.   }
  90.   
  91.   printf("Patching %s ...",argv[2]);
  92.   
  93.   readline(in,actual,MAXLEN);
  94.   while(readline(pat,patchstring,MAXLEN)!=EOF)
  95.   { if(strncmp(patchstring,"find ",5)==0)
  96.     { while(xcmp(patchstring+5,actual)!=0)
  97.       { writeline(out,actual);
  98.         if(readline(in,actual,MAXLEN)==EOF)
  99.         { printf("Error: %s not found in %s.\n",patchstring+5,argv[1]);
  100.           fclose(in);
  101.           fclose(out);
  102.           fclose(pat);
  103.           return 4;
  104.         }
  105.       }
  106.     }
  107.     else if(strncmp(patchstring,"delete",6)==0)
  108.     { a=1;
  109.       sscanf(patchstring+6,"%d",&a);
  110.       for(i=0;i<a;++i)readline(in,actual,MAXLEN);
  111.     }
  112.     else if(strncmp(patchstring,"insert ",7)==0)
  113.     { writeline(out,actual);
  114.       strcpy(actual,patchstring+7);
  115.     }
  116.     else if(strncmp(patchstring,"replace ",8)==0)
  117.     { strcpy(actual,patchstring+8);
  118.     }
  119.     else if(strncmp(patchstring,"next",4)==0)
  120.     { a=1;
  121.       sscanf(patchstring+4,"%d",&a);
  122.       for(i=0;i<a;++i)
  123.       { writeline(out,actual);
  124.         readline(in,actual,MAXLEN);
  125.       }
  126.     }
  127.     else if(xcmp(patchstring,"")==0); /* ignore empty line */
  128.     else if(*patchstring=='#'); /* ignore comment line */
  129.     else
  130.     { printf("Error: Syntax error in patchfile %s:\n%s\n",argv[3],patchstring);
  131.       fclose(in);
  132.       fclose(out);
  133.       fclose(pat);
  134.       return 5;
  135.     }
  136.   }
  137.   writeline(out,actual);
  138.   while(readline(in,actual,MAXLEN)!=EOF)writeline(out,actual);
  139.   
  140.   fclose(in);
  141.   fclose(pat);
  142.   fclose(out);
  143.   
  144.   printf("ok.\n");
  145.   return 0;
  146. }